package com.yao.mybatis.sqlnode;

import com.yao.mybatis.sqlsource.DynamicContext;
import com.yao.mybatis.utils.GenericTokenParser;
import com.yao.mybatis.utils.OgnlUtils;
import com.yao.mybatis.utils.SimpleTypeRegistry;
import com.yao.mybatis.utils.TokenHandler;

/**
 * @author Administrator
 */
public class TextSqlNode implements SqlNode{
    private String text;

    public TextSqlNode(String text) {
        this.text = text;
    }

    @Override
    public void apply(DynamicContext dynamicContext) {
        TokenHandler tokenHandler = new BindingTokenParser(dynamicContext);
        GenericTokenParser tokenParser = new GenericTokenParser("${", "}", tokenHandler);
        // tokenParser.parse(sqlText)参数是未处理的，返回值是已处理的（没有${}）
        dynamicContext.appendSql(tokenParser.parse(text));
    }

    /**
     * 判断文本中是否有${}
     * @return
     */
    public boolean isDynamic() {
        if (text.indexOf("${") > -1) {
            return true;
        }
        return false;
    }
    private static class BindingTokenParser implements TokenHandler {
        private DynamicContext context;

        public BindingTokenParser(DynamicContext context) {
            this.context = context;
        }

        /**
         * expression：比如说${username}，那么expression就是username username也就是Ognl表达式
         */
        @Override
        public String handleToken(String expression) {
            Object paramObject = context.getBindings().get("_parameter");
            if (paramObject == null) {
                // context.getBindings().put("value", null);
                return "";
            } else if (SimpleTypeRegistry.isSimpleType(paramObject.getClass())) {
                // context.getBindings().put("value", paramObject);
                return String.valueOf(paramObject);
            }

            // 使用Ognl api去获取相应的值
            Object value = OgnlUtils.getValue(expression, context.getBindings());
            String srtValue = value == null ? "" : String.valueOf(value);
            return srtValue;
        }

    }
}
